#include <stdio.h>
#include <string.h>
#include <ncurses.h> 
#include <unistd.h> 
 
#define PROGRESS_BAR_WIDTH 30 
#define BORDER_PADDING 2 
#define WINDOW_WIDTH (PROGRESS_BAR_WIDTH + 2 * BORDER_PADDING + 2) // 加边框的宽度  
#define WINDOW_HEIGHT 5 
#define PROGRESS_INCREMENT 3 
#define DELAY 300000 // 微秒（300毫秒）  
 
int main() { 
    initscr(); 
    start_color(); 
    init_pair(1, COLOR_GREEN, COLOR_BLACK); // 已完成部分：绿色前景，黑色背景  
    init_pair(2, COLOR_RED, COLOR_BLACK); // 剩余部分（虽然用红色可能不太合适，但为演示目的）：红色背景
    cbreak(); 
    noecho(); 
    curs_set(FALSE); 
    
    int max_y, max_x; 
    getmaxyx(stdscr, max_y, max_x); 
    int start_y = (max_y - WINDOW_HEIGHT) / 2; 
    int start_x = (max_x - WINDOW_WIDTH) / 2; 
    
    WINDOW *win = newwin(WINDOW_HEIGHT, WINDOW_WIDTH, start_y, start_x); 
    box(win, 0, 0); // 加边框  
    wrefresh(win); 
    
    int progress = 0; 
    int max_progress = PROGRESS_BAR_WIDTH; 
    
    while (progress <= max_progress) { 
    werase(win); // 清除窗口内容  
    
    // 计算已完成的进度和剩余的进度  
    int completed = progress; 
    int remaining = max_progress - progress;
    
    // 显示进度条  
    int bar_x = BORDER_PADDING + 1; // 进度条在窗口中的x坐标  
    int bar_y = 1; // 进度条在窗口中的y坐标（居中）  
    
    // 已完成部分  
    attron(COLOR_PAIR(1)); 
    for (int i = 0; i < completed; i++) { 
    mvwprintw(win, bar_y, bar_x + i, "#"); 
    } 
    attroff(COLOR_PAIR(1)); 
    
    // 剩余部分（用背景色填充）  
    attron(A_BOLD | COLOR_PAIR(2)); // 加粗并设置背景色为红色（仅用于演示）  
    for (int i = completed; i < max_progress; i++) { 
    mvwprintw(win, bar_y, bar_x + i, " "); 
    } 
    attroff(A_BOLD | COLOR_PAIR(2)); 
    
    // 显示百分比  
    char percent_str[10]; 
    snprintf(percent_str, sizeof(percent_str), "%d%%", (progress * 100) / max_progress); 
    int percent_x = (WINDOW_WIDTH - strlen(percent_str)) / 2; // 居中显示 
    mvwprintw(win, WINDOW_HEIGHT - 1, percent_x, percent_str); 
    wrefresh(win); // 刷新窗口以显示更新  
    
    // 增加进度  
    progress += PROGRESS_INCREMENT; 
    
    // 延迟一段时间  
    usleep(DELAY); 
    } 
    
    // 清理并退出ncurses模式  
    delwin(win); 
    endwin(); 
    return 0; 
}  
